package de.ssn.hibernate.core;

import java.io.InputStream;
import java.sql.Blob;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

/**
 * Die Klasse beinhaltet Hilfsfunktionen für das Session-Handling und sonstigen
 * Themen von Hibernate.
 * 
 * @author rogermi
 * 
 */
public class HibernateUtility {
	/** Hibernate-Konfiguration */
	private static Configuration config;
	/** Hibernate-SessionFactory */
	private static SessionFactory sessionFactory;
	/** Hibernate-ServiceRegistry */
	private static ServiceRegistry serviceRegistry;
	/**
	 * statischer Klassenkonstruktor
	 */
	static {
		getConfig().configure("hibernate.cfg.xml");
	}

	/**
	 * liefert die aktuell genutzte Hibernate-Konfiguration
	 * 
	 * @return Configuration
	 */
	public static Configuration getConfig() {
		if (config == null) {
			config = new Configuration();
		}
		return config;
	}

	/**
	 * liefert die aktuell genutzte Hibernate-ServiceRegistry
	 * 
	 * @return ServiceRegistry
	 */
	public static ServiceRegistry getServiceRegistry() {
		if (serviceRegistry == null) {
			serviceRegistry = new ServiceRegistryBuilder().applySettings(
					getConfig().getProperties()).buildServiceRegistry();
		}
		return serviceRegistry;
	}

	/**
	 * liefert die aktuell genutzte Hibernate-SessionFactory dabei wird eine
	 * neue Session geöffnet, falls keine geöffnet ist
	 * 
	 * @return SessionFactory
	 */
	public static SessionFactory getSessionFactory() {
		if (sessionFactory == null) {
			sessionFactory = getConfig().buildSessionFactory(
					getServiceRegistry());
		}
		return sessionFactory;
	}

	/**
	 * Gibt die aktuelle Session zurück
	 * 
	 * @return
	 */
	public static Session getCurrentSession() {
		return getSessionFactory().getCurrentSession();
	}

	/**
	 * erstellt ein binäres Objekt, das befüllt werden kann
	 * 
	 * @param InputStream
	 * @param länge
	 *            des Streams
	 * @return Datenbank-Binary-Objekt
	 */
	public static Blob createBlob(InputStream stream, long length) {

		return Hibernate.getLobCreator(getCurrentSession()).createBlob(stream,
				length);
	}

	/**
	 * liefert die Einstellungen der Hibernate-Konfiguration zurück <br/>
	 * <code>System.out.println(new ORMconfigurtaion());</code>
	 */
	public String toString() {
		String result = "";
		Properties props = getConfig().getProperties();

		Iterator<Entry<Object, Object>> iter = props.entrySet().iterator();
		while (iter.hasNext()) {
			Entry<Object, Object> entry = iter.next();

			result += entry.getKey() + "\t-\t" + entry.getValue() + "\n";
		}
		return result;
	}

}
